Node.js Security

Node.js பயன்பாடுகளுக்கான முழுமையான பாதுகாப்பு வழிகாட்டி

Node.js இல் பாதுகாப்பு ஏன் முக்கியமானது

Node.js பயன்பாடுகளுக்கு பாதுகாப்பு பல காரணங்களால் முக்கியமானது:

JavaScript சூழல் அளவு

npm பதிவேட்டில் 1.5 மில்லியனுக்கும் மேற்பட்ட தொகுப்புகள் உள்ளன, இது அனைத்து சார்புகளின் பாதுகாப்பையும் சரிபார்க்க கடினமாக உள்ளது

சேவையக-பக்க செயலாக்கம்

கிளையன்ட்-சைட் JavaScript போலல்லாமல், Node.js கோப்பு அமைப்புகள், நெட்வொர்க்குகள் மற்றும் பிற முக்கியமான வளங்களுக்கு அணுகல் உள்ளது

இயல்புநிலை அனுமதி

Node.js இல் இயல்புநிலையில் சில பாதுகாப்பு கட்டுப்பாடுகள் உள்ளன, இது பாதுகாப்பான குறியீட்டு நடைமுறைகளை அத்தியாவசியமாக்குகிறது

நிகழ்வு-வழங்கிய கட்டமைப்பு

அசிங்க்ரோனஸ் செயல்பாடுகள் சிக்கலான செயலாக்க ஓட்டங்களை உருவாக்கும், அவை பாதுகாப்பு குறைபாடுகளை மறைக்கலாம்

Node.js பயன்பாடுகள் சமரசம் செய்யப்படும் போது, தாக்குதல் நடத்துபவர்கள்:

முக்கியமான பயனர் தரவை அணுகலாம்
பயன்பாட்டு நடத்தையை கையாளலாம்
கிரிப்டோகரன்சி சுரங்கத்திற்கு உங்கள் சேவையகத்தைப் பயன்படுத்தலாம்
மற்ற கணினிகளுக்கு எதிராக தாக்குதல்களைத் தொடங்கலாம்
உங்கள் அமைப்பின் நற்பெயரை சேதப்படுத்தலாம்

Node.js இல் பொதுவான பாதுகாப்பு குறைபாடுகள்

குறைபாடு விளக்கம் தாக்கம்
ஊசி தாக்குதல்கள் பயன்பாட்டால் செயலாக்கப்படும் உள்ளீடுகளில் தீங்கு விளைவிக்கும் குறியீட்டைச் செருகுதல் (SQL, NoSQL, OS கட்டளைகள்) தரவு திருட்டு, அங்கீகரிக்கப்படாத அணுகல், சேவை இடையூறு
குறுக்கு-தள ஸ்கிரிப்டிங் (XSS) மற்ற பயனர்கள் பார்க்கும் வலைப் பக்கங்களில் கிளையன்ட்-சைட் ஸ்கிரிப்ட்களை உட்செலுத்துதல் அமர்வு கடத்தல், சான்றுகள் திருட்டு, திருத்தம்
உடைந்த அங்கீகாரம் சான்றுகள் சமரசத்தை அனுமதிக்கும் அங்கீகார வழிமுறைகளில் உள்ள குறைபாடுகள் கணக்கு ஏற்றுக்கொள்ளல், சலுகை எச்.றி
பாதுகாப்பற்ற சார்புகள் அறியப்பட்ட குறைபாடுகள் கொண்ட மூன்றாம் தர தொகுப்புகளைப் பயன்படுத்துதல் சார்புகளிலிருந்து அனைத்து குறைபாடுகளையும் பரம்பரையாகப் பெறுதல்
தகவல் வெளிப்பாடு பிழை செய்திகள், பதிவுகள் அல்லது பதில்கள் மூலம் முக்கியமான தரவை கசிவு செய்தல் கணினி தகவல் வெளிப்பாடு, தரவு கசிவு
குறுக்கு-தள கோரிக்கை மோசடி அங்கீகரிக்கப்பட்ட பயனர்களை தேவையற்ற செயல்களைச் செய்ய ஏமாற்றுதல் பயனர்கள் சார்பாக அங்கீகரிக்கப்படாத செயல்பாடுகளைச் செய்தல்
பாதுகாப்பு தவறான கட்டமைப்பு Node.js பயன்பாடுகளில் பாதுகாப்பு அமைப்புகளின் தவறான கட்டமைப்பு பல்வேறு பாதுகாப்பு இடைவெளிகள் மற்றும் குறைபாடுகள்
பாதை கடக்கும் நோக்கம் கொண்ட பயன்பாட்டுப் பாதைகளுக்கு வெளியே கோப்புகள் மற்றும் அடைவுகளை அணுகுதல் அங்கீகரிக்கப்படாத கோப்பு அணுகல், குறியீட்டு செயலாக்கம்

அத்தியாவசிய பாதுகாப்பு சிறந்த நடைமுறைகள்

1. உள்ளீட்டு சரிபார்ப்பு மற்றும் சுத்திகரிப்பு

பயனர் உள்ளீட்டை ஒருபோதும் நம்ப வேண்டாம். உங்கள் பயன்பாட்டிற்கு வெளியே இருந்து வரும் அனைத்து தரவையும் எப்போதும் சரிபார்க்கவும் சுத்திகரிக்கவும்.

எடுத்துக்காட்டு: Express-Validator உடன் உள்ளீட்டு சரிபார்ப்பு

const express = require('express');
const { body, validationResult } = require('express-validator');
const app = express();

app.use(express.json());

// Define validation rules
const userValidationRules = [
  body('email').isEmail().normalizeEmail(),
  body('password').isLength({ min: 8 }),
  body('age').isInt({ min: 18 }).toInt(),
  body('name').trim().escape().notEmpty()
];

// Apply validation
app.post('/register', userValidationRules, (req, res) => {
  // Check for validation errors
  const errors = validationResult(req);
  
  if (!errors.isEmpty()) {
    return res.status(400).json({ errors: errors.array() });
  }

  // Process validated data
  const { email, password, age, name } = req.body;
  // ... safe to use validated data

  res.status(201).json({ message: 'User registered successfully' });
});

2. ஊசி தாக்குதல்களுக்கு எதிரான பாதுகாப்பு

SQL, NoSQL, கட்டளை ஊசி மற்றும் ஒத்த தாக்குதல்களை தடுக்க, parameterized queries ஐப் பயன்படுத்தவும் மற்றும் பயனர் உள்ளீட்டின் நேரடி இணைப்பைத் தவிர்க்கவும்.

எடுத்துக்காட்டு: SQL ஊசி தடுப்பு

// VULNERABLE - DO NOT USE
function searchUsersUnsafe(name) {
  // Direct string concatenation - VULNERABLE TO INJECTION
  return db.query(`SELECT * FROM users WHERE name LIKE '%${name}%'`);
}

// SAFE - USE THIS APPROACH
function searchUsersSafe(name) {
  // Parameterized query - PROTECTED AGAINST INJECTION
  return db.query('SELECT * FROM users WHERE name LIKE ?', [`%${name}%`]);
}

3. குறுக்கு-தள ஸ்கிரிப்டிங் (XSS) தடுப்பு

வெளியீட்டை சரியாக குறியாக்கம் செய்வதன் மூலமும் மற்றும் Content Security Policy (CSP) ஐப் பயன்படுத்துவதன் மூலமும் XSS க்கு எதிராக பாதுகாக்கவும்.

எடுத்துக்காட்டு: XSS தடுப்பு

const express = require('express');
const app = express();

// VULNERABLE - Direct insertion of user input into HTML
app.get('/unsafe', (req, res) => {
  const userInput = req.query.message || '';
  res.send(`
Your message: ${userInput}
`); }); // SAFE - Encoding user input app.get('/safe', (req, res) => { const userInput = req.query.message || ''; // Encode HTML special characters const safeInput = userInput .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"') .replace(/'/g, '''); res.send(`
Your message: ${safeInput}
`); });

4. சார்புகளை புதுப்பித்தல்

npm audit மற்றும் பிற பாதுகாப்பு கருவிகளைப் பயன்படுத்தி குறைபாடுள்ள சார்புகளுக்காக தவறாமல் சோதித்து புதுப்பிக்கவும்.

குறைபாடுகளை சரிபார்க்கிறது

# Check for vulnerable dependencies
npm audit

# Automatically fix vulnerabilities when possible
npm audit fix

# Check for vulnerable dependencies in production only
npm audit --production

# Generate a detailed report
npm audit --json > audit-report.json

5. பாதுகாப்பான அங்கீகார நடைமுறைகள்

சரியான கடவுச்சொல் ஹாஷிங், கணக்கு பூட்டுகள் மற்றும் பல-காரணி அங்கீகாரத்துடன் பாதுகாப்பாக அங்கீகாரத்தை செயல்படுத்தவும்.

எடுத்துக்காட்டு: பாதுகாப்பான கடவுச்சொல் ஹாஷிங்

const crypto = require('crypto');

// Generate a random salt
function generateSalt() {
  return crypto.randomBytes(16).toString('hex');
}

// Hash password with PBKDF2
function hashPassword(password, salt) {
  return crypto.pbkdf2Sync(password, salt, 10000, 64, 'sha512').toString('hex');
}

// Register a new user with secure password storage
function registerUser(username, password) {
  // Generate unique salt for this user
  const salt = generateSalt();
  
  // Hash the password with the salt
  const hashedPassword = hashPassword(password, salt);
  
  // Store username, hashedPassword, and salt in database
  // NEVER store plaintext passwords
  return { username, hashedPassword, salt };
}

// Verify a login attempt
function verifyUser(username, password, storedHash, storedSalt) {
  // Hash the provided password with the stored salt
  const hashedAttempt = hashPassword(password, storedSalt);
  
  // Time-constant comparison to prevent timing attacks
  return crypto.timingSafeEqual(
    Buffer.from(hashedAttempt, 'hex'),
    Buffer.from(storedHash, 'hex')
  );
}

6. பாதுகாப்பு தலைப்புகளைப் பயன்படுத்தவும்

பல்வேறு தாக்குதல்களிலிருந்து பாதுகாக்க HTTP பாதுகாப்பு தலைப்புகளை செயல்படுத்தவும். இதை எளிதாக்க Helmet.js போன்ற தொகுப்புகளைப் பயன்படுத்தவும்.

எடுத்துக்காட்டு: Helmet.js பயன்படுத்துதல்

const express = require('express');
const helmet = require('helmet');
const app = express();

// Apply all security headers with default settings
app.use(helmet());

// Or customize specific headers
app.use(helmet({
  contentSecurityPolicy: {
    directives: {
      defaultSrc: ["'self'"],
      scriptSrc: ["'self'", "'unsafe-inline'", 'trusted-cdn.com']
    }
  },
  // Prevent clickjacking
  frameguard: { action: 'deny' },
  // Strict-Transport-Security
  hsts: { maxAge: 15552000, includeSubDomains: true }
}));

7. HTTPS ஐப் பயன்படுத்தவும்

பயணத்தில் உள்ள தரவை குறியாக்கம் செய்ய எப்போதும் உற்பத்தி சூழல்களில் HTTPS ஐப் பயன்படுத்தவும்.

எடுத்துக்காட்டு: Express இல் HTTPS அமைத்தல்

const https = require('https');
const fs = require('fs');
const express = require('express');

const app = express();

// Your Express routes here
app.get('/', (req, res) => {
  res.send('Secure HTTPS Server');
});

// HTTPS configuration
const options = {
  key: fs.readFileSync('path/to/private-key.pem'),
  cert: fs.readFileSync('path/to/certificate.pem'),
  // Modern, secure TLS options
  minVersion: 'TLSv1.2',
  ciphers: 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256'
};

// Create HTTPS server
https.createServer(options, app).listen(443, () => {
  console.log('HTTPS server running on port 443');
});

8. முக்கியமான தரவைப் பாதுகாக்கவும்

சூழல் மாறிகள் மற்றும் அர்ப்பணிக்கப்பட்ட இரகசிய மேலாண்மை தீர்வுகளைப் பயன்படுத்தி முக்கியமான தரவைப் பாதுகாப்பாக சேமிக்கவும்.

எடுத்துக்காட்டு: சூழல் மாறிகள் பயன்படுத்துதல்

// Load environment variables from .env file in development
if (process.env.NODE_ENV !== 'production') {
  require('dotenv').config();
}

// Access environment variables
const dbConnection = {
  host: process.env.DB_HOST,
  username: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_NAME
};

// Never log sensitive information
console.log('Connected to database:', dbConnection.host);
// DON'T DO THIS: console.log('Database connection:', dbConnection);

⚠️ முக்கியமானது:

முக்கியமான தரவை பதிப்பு கட்டுப்பாட்டிற்கு ஒருபோதும் சமர்ப்பிக்க வேண்டாம். .env கோப்புகளை விலக்க .gitignore ஐப் பயன்படுத்தவும்.

சார்பு குறைபாடு மேலாண்மை

Node.js பயன்பாடுகள் பொதுவாக பல சார்புகளைக் கொண்டிருக்கின்றன, ஒவ்வொன்றும் பாதுகாப்பு குறைபாடுகளை அறிமுகப்படுத்தக்கூடும்.

பயன்பாட்டு பாதுகாப்பை பராமரிக்க சரியான சார்பு மேலாண்மை அத்தியாவசியமானது.

npm audit பயன்படுத்துதல்

npm audit கட்டளை உங்கள் சார்பு மரத்தை ஸ்கேன் செய்து அறியப்பட்ட குறைபாடுகள் கொண்ட தொகுப்புகளை அடையாளம் காண்கிறது:

# Run a basic audit
npm audit

# Fix vulnerabilities automatically (when possible)
npm audit fix

# Fix vulnerabilities that might require major version updates
npm audit fix --force

npm audit இன் வெளியீடு உள்ளடக்கியது:

குறைபாடு தீவிரம் (குறைந்த, மிதமான, உயர், முக்கியமான)
பாதிக்கப்பட்ட தொகுப்பு மற்றும் குறைபாடுள்ள பதிப்பு வரம்பு
குறைபாட்டின் விளக்கம்
குறைபாடுள்ள சார்புக்கான பாதை
சிக்கலை சரிசெய்ய பரிந்துரைக்கப்பட்ட செயல்கள்

குறைபாடு தடுப்பு உத்திகள்

சார்புகளை பூட்டு: சார்பு பதிப்புகளை பூட்ட package-lock.json அல்லது yarn.lock ஐப் பயன்படுத்தவும்
குறைந்தபட்ச பதிப்புகளை அமைக்கவும்: குறைந்தபட்ச வரம்புகளுடன் பதிப்பு வரம்புகளைப் பயன்படுத்தவும்
தானியங்கி ஸ்கேனிங்: உங்கள் CI/CD குழாயில் பாதுகாப்பு ஸ்கேனிங்கை ஒருங்கிணைக்கவும்
மாற்றுகளைக் கவனியுங்கள்: சிக்கலான தொகுப்புகளுக்கு, சிறந்த பாதுகாப்பு பதிவுகள் கொண்ட மாற்றுகளை ஆராயுங்கள்

மூன்றாம் தர பாதுகாப்பு கருவிகள்

கருவி நோக்கம்
Snyk சார்புகளை ஸ்கேன் செய்கிறது, தானியங்கி சரி PRகளை வழங்குகிறது மற்றும் பயன்பாடுகளை தொடர்ந்து கண்காணிக்கிறது
SonarQube உங்கள் குறியீட்டில் குறைபாடுகள், குறியீட்டு வாசனைகள் மற்றும் பராமரிப்பு சிக்கல்களை கண்டறிகிறது
OWASP Dependency-Check அறியப்பட்ட குறைபாடுகள் கொண்ட திட்ட சார்புகளை அடையாளம் காண்கிறது
WhiteSource Bolt திறந்த மூல கூறுகளுக்கான தொடர்ச்சியான பாதுகாப்பு மற்றும் இணக்கத்தன்மை

மேம்பட்ட பாதுகாப்பு நடைமுறைகள்

விகித வரம்பு

விகித வரம்பை செயல்படுத்துவதன் மூலம் துஷ்பிரயோகம் அல்லது ப்ரூட் ஃபோர்ஸ் தாக்குதல்களிலிருந்து உங்கள் API ஐப் பாதுகாக்கவும்:

எடுத்துக்காட்டு: Express-Rate-Limit உடன் விகித வரம்பு

const express = require('express');
const rateLimit = require('express-rate-limit');
const app = express();

// Basic rate limiter: max 100 requests per 15 minutes per IP
const limiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 minutes
  max: 100, // limit each IP to 100 requests per windowMs
  standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers
  message: 'Too many requests from this IP, please try again after 15 minutes'
});

// Apply rate limiting to all requests
app.use(limiter);

// Or apply to specific routes
const loginLimiter = rateLimit({
  windowMs: 60 * 60 * 1000, // 1 hour
  max: 5, // 5 failed attempts per hour
  message: 'Too many login attempts, please try again after an hour'
});

app.post('/login', loginLimiter, (req, res) => {
  // Login logic here
});

CSRF பாதுகாப்பு

CSRF டோக்கன்களை செயல்படுத்துவதன் மூலம் குறுக்கு-தள கோரிக்கை மோசடி தாக்குதல்களைத் தடுக்கவும்:

எடுத்துக்காட்டு: csurf உடன் CSRF பாதுகாப்பு

const express = require('express');
const cookieParser = require('cookie-parser');
const csrf = require('csurf');
const app = express();

// Setup middleware
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());

// Initialize CSRF protection
const csrfProtection = csrf({ cookie: true });

// Form display route with CSRF token
app.get('/form', csrfProtection, (req, res) => {
  res.send(`
    
`); }); // Form submission route with CSRF validation app.post('/process', csrfProtection, (req, res) => { // If we get here, CSRF token was valid res.send('Data processed successfully'); }); // CSRF errors will be caught here app.use((err, req, res, next) => { if (err.code === 'EBADCSRFTOKEN') { // Handle CSRF token errors res.status(403).send('CSRF token validation failed'); } else { next(err); } });

பாதுகாப்பான மேம்பாட்டு சுழற்சி (SDLC)

பாதுகாப்பான Node.js பயன்பாடுகளை உருவாக்குவது முழு மேம்பாட்டு செயல்முறையிலும் பாதுகாப்பை ஒருங்கிணைக்க வேண்டும்.

இந்த SDLC சிறந்த நடைமுறைகளைப் பின்பற்றவும்:

1. தேவைகள் & வடிவமைப்பு கட்டம்

  • பாதுகாப்பு தேவைகள் மற்றும் இணக்க தேவைகளை வரையறுக்கவும்
  • சாத்தியமான அபாயங்களை அடையாளம் காண அச்சுறுத்தல் மாடலிங் செய்யவும்
  • பாதுகாப்பு கொள்கைகளை மனதில் கொண்டு வடிவமைக்கவும்
  • பாதுகாப்பான கட்டமைப்புகள் மற்றும் நூலகங்களைத் தேர்ந்தெடுக்கவும்

2. மேம்பாட்டு கட்டம்

  • பாதுகாப்பான குறியீட்டு தரங்கள் மற்றும் லிண்டர்களைப் பயன்படுத்தவும்
  • உள்ளீட்டு சரிபார்ப்பு மற்றும் வெளியீட்டு குறியாக்கத்தை செயல்படுத்தவும்
  • தரவுத்தள அணுகலுக்கு parameterized queries ஐப் பயன்படுத்தவும்
  • குறைந்த சலுகை கொள்கையைப் பின்பற்றவும்

3. சோதனை கட்டம்

  • நிலையான பயன்பாட்டு பாதுகாப்பு சோதனை (SAST) நடத்தவும்
  • டைனமிக் பயன்பாட்டு பாதுகாப்பு சோதனை (DAST) செய்யவும்
  • சார்பு குறைபாடு ஸ்கேன்களை இயக்கவும்
  • ஊடுருவல் சோதனையை நடத்தவும்

4. விநியோகம் & பராமரிப்பு

  • பாதுகாப்பான கட்டமைப்பு மேலாண்மையைப் பயன்படுத்தவும்
  • தொடர்ச்சியான பாதுகாப்பு கண்காணிப்பை செயல்படுத்தவும்
  • சம்பவ பதில் திட்டத்தை நிறுவவும்
  • தவறாமல் பாதுகாப்பு தணிக்கைகளை திட்டமிடவும்

எடுத்துக்காட்டு: பாதுகாப்பான மேம்பாட்டு சரிபார்ப்புப் பட்டியல்

// package.json example with security-related scripts
{
  "name": "secure-node-app",
  "version": "1.0.0",
  "scripts": {
    "start": "node app.js",
    "test": "jest",
    "lint": "eslint . --ext .js",
    "audit": "npm audit --production --audit-level=high",
    "check-vuln": "npx snyk test",
    "security-check": "npm-run-all --parallel lint audit check-vuln",
    "precommit": "npm run security-check"
  },
  "dependencies": {
    // Production dependencies
  },
  "devDependencies": {
    "eslint": "^8.0.0",
    "eslint-plugin-security": "^1.5.0",
    "jest": "^29.0.0",
    "npm-run-all": "^4.1.5",
    "snyk": "^1.1000.0"
  },
  "husky": {
    "hooks": {
      "pre-commit": "npm run security-check"
    }
  }
}

💡 உதவிக்குறிப்பு:

அவை உற்பத்தியை அடையும் முன் பாதுகாப்பு சிக்கல்களை தானாகவே கண்டறிய உங்கள் CI/CD குழாயில் பாதுகாப்பு சோதனைகளை ஒருங்கிணைக்கவும்.

சுருக்கம்

பாதுகாப்பு என்பது ஒரு முறை செயல்படுத்தல் அல்ல, ஆனால் தொடர்ச்சியான செயல்முறையாகும்.

உங்கள் Node.js பயன்பாடுகளைப் பாதுகாக்க இந்த சிறந்த நடைமுறைகளைப் பின்பற்றவும்:

அனைத்து உள்ளீட்டையும் சரிபார்க்கவும் சுத்திகரிக்கவும்

பொதுவான தாக்குதல்களுக்கு எதிராக பாதுகாக்கவும்

சார்புகளை புதுப்பித்து தவறாமல் தணிக்கை செய்யவும்

பாதுகாப்பான அங்கீகாரம் மற்றும் அமர்வு மேலாண்மையை செயல்படுத்தவும்

HTTPS மற்றும் சரியான பாதுகாப்பு தலைப்புகளைப் பயன்படுத்தவும்

முக்கியமான தரவைப் பாதுகாப்பாக சேமிக்கவும்

விகித வரம்பு மற்றும் கண்காணிப்பை செயல்படுத்தவும்

நிறுவப்பட்ட பாதுகாப்பு வழிகாட்டுதல்களைப் பின்பற்றவும்

💡 நினைவில் கொள்ளுங்கள்:

பாதுகாப்பு உங்கள் பயன்பாட்டில் உள்ள பலவீனமான இணைப்பைப் போலவே வலுவானது. அனைத்து உற்பத்தி பயன்பாடுகளுக்கும் தவறாமல் பாதுகாப்பு மதிப்பாய்வுகள் மற்றும் ஊடுருவல் சோதனை பரிந்துரைக்கப்படுகிறது.

பயிற்சி

______ கட்டளை உங்கள் சார்புகளில் குறைபாடுகளை சரிபார்க்கிறது.

npm audit
✓ சரி! "npm audit" கட்டளை உங்கள் சார்பு மரத்தை ஸ்கேன் செய்து அறியப்பட்ட பாதுகாப்பு குறைபாடுகள் கொண்ட தொகுப்புகளை அடையாளம் காண்கிறது. இது குறைபாடுகளை சரிசெய்ய பரிந்துரைகளையும் வழங்குகிறது.
npm check
✗ தவறு! "npm check" என்பது ஒரு செல்லுபடியாகும் npm கட்டளை அல்ல. சார்பு குறைபாடுகளை சரிபார்க்க "npm audit" பயன்படுத்தப்படுகிறது.
npm security
✗ தவறு! "npm security" என்பது ஒரு செல்லுபடியாகும் npm கட்டளை அல்ல. சார்பு குறைபாடுகளை சரிபார்க்க "npm audit" பயன்படுத்தப்படுகிறது.
npm scan
✗ தவறு! "npm scan" என்பது ஒரு செல்லுபடியாகும் npm கட்டளை அல்ல. சார்பு குறைபாடுகளை சரிபார்க்க "npm audit" பயன்படுத்தப்படுகிறது.